home *** CD-ROM | disk | FTP | other *** search
- #include <stddef.h>
- #include <std.h>
- #include <dos.h>
- #include "mlvalues.h"
- #include "signals.h"
- #include "instruct.h"
- #include "fail.h"
-
- unsigned char raise_break_exn[] = { ATOM, BREAK_EXN, RAISE };
-
- static int catch_break = 0;
-
- value sys_catch_break(onoff)
- value onoff;
- {
- union REGS r;
- catch_break = Tag_val(onoff);
- r.x.ax = 0x3301;
- r.x.dx = catch_break ? 2 : 1;
- int86(0x21, &r, &r);
- return Atom(0);
- }
-
- void poll_break()
- {
- union REGS r;
- if (catch_break == 0) return;
- r.x.ax = 0x3303;
- int86(0x21, &r, &r);
- if (r.x.dx != 0) {
- signal_handler = raise_break_exn;
- signal_number = 0;
- execute_signal();
- }
- }
-
- /* Special input function for MS-DOS (to take advantage of external line
- editors when reading from the console. */
-
- static struct {
- unsigned char max_len;
- unsigned char act_len;
- char data[200];
- } read_buffer;
-
- static int stdin_is_console = -1;
- static int stdin_at_eof = 0; /* Valid only if stdin_is_console==1 */
-
- int msdos_read(fd, ptr, len)
- int fd;
- char * ptr;
- unsigned len;
- {
- if (fd == 0) {
- if (stdin_is_console == -1) {
- union REGS regs;
- regs.x.ax = 0x4400;
- regs.x.bx = fd;
- intdos(®s, ®s);
- stdin_is_console = (regs.x.dx & 0x81) == 0x81;
- }
- /* Modified for Moscow SML 1994-08-23 to detect control-Z = 0x1A */
- if (stdin_is_console)
- if (stdin_at_eof)
- return 0;
- else
- {
- read_buffer.max_len = sizeof(read_buffer.data) - 1;
- if (len <= read_buffer.max_len) read_buffer.max_len = len - 1;
- if (bdosptr(0xA, &read_buffer, 0) != 0) poll_break();
- bdos(0x2, '\n', 0);
- read_buffer.data[read_buffer.act_len] = '\n';
- bcopy(read_buffer.data, ptr, read_buffer.act_len + 1);
- {int i;
- for (i=0; (i<read_buffer.act_len)&&(read_buffer.data[i]!=0x1A);
- i++);
- if (read_buffer.data[i] == 0x1A)
- {
- stdin_at_eof = 1;
- return i;
- }
- else
- return read_buffer.act_len + 1;
- }
- }
- }
- return read(fd, ptr, len);
- }
-
- /* Search path function */
-
- char * searchpath(name)
- char * name;
- {
- static char fullname[256];
- char * path;
- char * p;
- char * q;
-
- if (name[1] == ':') return name;
- for (p = name; *p != 0; p++) {
- if (*p == '\\') return name;
- }
- path = getenv("PATH");
- if (path == 0) return 0;
- while(1) {
- p = fullname;
- while (*path != 0 && *path != ';') {
- *p++ = *path++;
- }
- if (p != fullname) *p++ = '\\';
- q = name;
- while (*q != 0) {
- *p++ = *q++;
- }
- *p = 0;
- if (access(fullname, 4) == 0) return fullname;
- *p++ = '.';
- *p++ = 'e';
- *p++ = 'x';
- *p++ = 'e';
- *p = 0;
- if (access(fullname, 4) == 0) return fullname;
- if (*path == 0) return 0;
- path++;
- }
- }
-
- /* To reconstruct the command-line arguments when they are passed through
- the environment. */
-
- char ** parse_args(cmdname, cmdline)
- char * cmdname, * cmdline;
- {
- char * p;
- int argc;
- char ** argv;
- int i;
-
- p = cmdline;
- argc = 1;
- inword:
- switch (*p++) {
- case 0 : argc++; goto finished;
- case ' ': p[-1] = 0; argc++; goto skipblanks;
- default : goto inword;
- }
- skipblanks:
- switch (*p++) {
- case 0 : goto finished;
- case ' ': goto skipblanks;
- default : goto inword;
- }
- finished:
- argv = (char **) malloc((argc + 1) * sizeof(char *));
- argv[argc] = NULL;
- argv[0] = cmdname;
- for (i = 1, p = cmdline; i < argc; i++) {
- while(*p == ' ') p++;
- argv[i] = p;
- while(*p++ != 0) /*nothing*/;
- }
- return argv;
- }
-
- char ** check_args(argv)
- char ** argv;
- {
- char * cmdline;
-
- if (argv[1] == NULL && (cmdline = getenv("*")) != NULL)
- return parse_args(argv[0], cmdline);
- else
- return argv;
- }
-
- /* EMX provides the built-in chdir2 which would make this obsolete: */
- value sml_setdisk(volno) /* ML */
- value volno;
- {
- setdisk(Long_val(volno));
- return Atom(0);
- }
-